/**
 * @官方网站 : https://douma.ke.qq.com
 * @微信公众号 : 抖码课堂
 * @官方微信号 : bigdatatang01
 * @作者 : 老汤
 *
 * 在 linux 中编译：gcc bad_cnt.c -o bad_cnt -lpthread
 * pthread 库不是 Linux 系统默认的库，连接时需要使用静态库 libpthread.a
 */

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void *count(void *vargp);

long cnt = 0;

int main(int argc, char **argv) {
    long n;
    pthread_t tid1, tid2;

    if (argc != 2) {
        printf("usage: %s <n> \n", argv[0]);
        exit(0);
    }

    n = atoi(argv[1]);

    // 创建两个线程，并执行 count 函数
    pthread_create(&tid1, NULL, count, &n);
    pthread_create(&tid2, NULL, count, &n);

    // 等待两个线程结束
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    // 检查结果
    if (cnt != (2 * n)) {
        printf("BOOM！cnt = %ld\n", cnt);
    } else {
        printf("OK！cnt = %ld\n", cnt);
    }

    exit(0);
}

// 对全局变量 cnt 进程累加 n 次
void *count(void *vargp) {
    long i, n = *((long *)vargp);
    for (i = 0; i < n; ++i) {
        cnt++;
    }
    return NULL;
}
